import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class GUItablero extends JFrame implements ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public void actionPerformed(ActionEvent e) {
		opcion(e);		
	}
	static JButton matBotones[][]=new JButton[10][10];
	static JButton btnAux;
	static JPanel panel=new JPanel(new GridLayout(10,10));
	static JFrame frAux=new JFrame();
	
	static int matriza[][] = new int[10][10];
	static int matrizb[][] = new int[10][10];
	static int matrizc[][] = new int[10][10];
	static int matrizd[][] = new int[10][10];
	static int matrize[][] = new int[10][10];
	
	static boolean ba=true;
	static boolean bb=true;
	static boolean bc=true;
	static boolean bd=true;
	static boolean be=true;
	
	public static void finJuego(){
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){				
				matBotones[i][k].setEnabled(false);		
			}
		}
	}
	
	public GUItablero(){
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		
		setSize(400,400);
		setVisible(true);
		setTitle("Prueba interfaz");
		setLocationRelativeTo(null);
		add(panel);
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){
				btnAux=new JButton(" ");
				matBotones[i][k]=btnAux;
				btnAux.addActionListener(this);
				panel.add(matBotones[i][k]);			
			}
		}
		
	}
	
	public static void hundido(String str){
		
		JOptionPane.showMessageDialog(frAux,
			    str,
			    "Barco hundido:",
			    JOptionPane.PLAIN_MESSAGE);

	}
	
	public static void opcion(ActionEvent e){
		Object obj=e.getSource();
		for(int i=0;i<10;i++){
			for(int k=0;k<10;k++){
				if(obj.equals(matBotones[i][k])){
					comprobarCoor(i,k);
					matBotones[i][k].setEnabled(false);
					if(Comprobara(matrize)& ba){hundido("Barco de 2 hundido");ba=false;}
					if(Comprobarb(matrize) & bb){hundido("\tBarco de 3 hundido");bb=false;}
					if(Comprobarc(matrize) & bc){hundido("\tBarco de 3 hundido");bc=false;}
					if(Comprobard(matrize) & bd){hundido("\tBarco de 4 hundido");bd=false;}
					if(Comprobare(matrize) & be){hundido("\tBarco de 5 hundido");be=false;}
					if(Comprobar(matrize)!=true){
						hundido("\nJuego finalizado");finJuego();
						
					}
				}
			}
		}
	}
	
	public static void poneragua(int [][]matriz,int p1, int p2, int p1f, int p2f)
	{
		int a1=p1;
		int a2=p2;
		int a1f=p1f;
		int a2f=p2f;
		int col,row;
		col=a2f-a2;
		row=a1f-a1;

		if(row==0) //es horizontal
		{
			if(a2<a2f) //desplazamiento hacia la derecha
			{
				for(int a=a1-1;a<=a1+1;a++)
				{
					for(int b=a2-1;b<=a2f+1;b++)
					{
						try
						{
							if(matriz[a][b]==0 || matriz[a][b]==9)
							{
								matriz[a][b]=9;
							}
						}
						catch(ArrayIndexOutOfBoundsException e)
						{
						}
					}
				}
			}
			else //desplazamiento hacia la izquierda
			{
				for(int a=a1-1;a<=a1+1;a++)
				{
					for(int b=a2f-1;b<=a2+1;b++)
					{
						try
						{
							if(matriz[a][b]==0 || matriz[a][b]==9)
							{
								matriz[a][b]=9;
							}
						}
						catch(ArrayIndexOutOfBoundsException e)
						{
						}
					}
				}				
			}
		}
		else //es vertical
		{
			if(a1<a1f) //desplazamiento hacia abajo
			{	
				for(int a=a1-1;a<=a1f+1;a++)
				{
					for(int b=a2-1;b<=a2+1;b++)
					{
						try
						{
							if(matriz[a][b]==0 || matriz[a][b]==9)
							{
								matriz[a][b]=9;
							}
						}
						catch(ArrayIndexOutOfBoundsException e)
						{
						}
					}
				}				
			}
			else //desplazamiento hacia arriba
			{
				for(int a=a1f-1;a<=a1+1;a++)
				{
					for(int b=a2-1;b<=a2+1;b++)
					{
						try
						{
							if(matriz[a][b]==0 || matriz[a][b]==9)
							{
								matriz[a][b]=9;
							}
						}
						catch(ArrayIndexOutOfBoundsException e)
						{
						}
					}
				}					
			}
		}
	}
	
	public static void generar(){
		//creamos una matriz de 10 filas y 10 columnas en la que se almacenaran las posiciones de los barcos


				//generamos 5 puntos (a[2],b[3],c[3],d[4],e[5])

				int a1f=0,a2f=0,b1f=0,b2f=0,c1f=0,c2f=0,d1f=0,d2f=0,e1f=0,e2f=0,a1=0,a2=0,b1=0,b2=0,c1=0,c2=0,d1=0,d2=0,e1=0,e2=0;
				boolean error=false;
				
				do
				{
					for(int j=0;j<10;j++)
					{
						for(int k=0;k<10;k++)
						{
							matriza[j][k]=0;
						}
					}
					try
					{
						error=false;
						int abarco=2;
						a1=(int)Math.round(Math.random()*9);
						a2=(int)Math.round(Math.random()*9);
						matriza[a1][a2]=1;
						a1f=a1;
						a2f=a2;

						//Creamos la orientacion del barco
						int adir=(int)(Math.random()*4)+1;
						switch (adir)
						{
							case 1: for(int i=1;i<abarco;i++){a1++;matriza[a1][a2]=1;};break;
							case 2: for(int i=1;i<abarco;i++){a1--;matriza[a1][a2]=1;};break;
							case 3: for(int i=1;i<abarco;i++){a2--;matriza[a1][a2]=1;};break;
							case 4: for(int i=1;i<abarco;i++){a2++;matriza[a1][a2]=1;};break;
						}
						
						poneragua(matriza,a1, a2, a1f, a2f);
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						error=true;
					}

				}while(error);

				do
				{
					for(int j=0;j<10;j++)
					{
						for(int k=0;k<10;k++)
						{
							matrizb[j][k]=matriza[j][k];
						}
					}
					
					try
					{
						error=false;
						b1=(int)Math.round(Math.random()*9);
						b2=(int)Math.round(Math.random()*9);
						int bbarco=3;
					

						if(matrizb[b1][b2]!=0)
						{
							error=true;
						}
						else
						{
							matrizb[b1][b2]=2;
							b1f=b1;
							b2f=b2;

							int bdir=(int)(Math.random()*4)+1;
							switch (bdir)
							{
								case 1: for(int i=1;i<bbarco;i++){b1++;if(matrizb[b1][b2]!=0){error=true;}else{matrizb[b1][b2]=2;};};break;
								case 2: for(int i=1;i<bbarco;i++){b1--;if(matrizb[b1][b2]!=0){error=true;}else{matrizb[b1][b2]=2;};};break;
								case 3: for(int i=1;i<bbarco;i++){b2--;if(matrizb[b1][b2]!=0){error=true;}else{matrizb[b1][b2]=2;};};break;
								case 4: for(int i=1;i<bbarco;i++){b2++;if(matrizb[b1][b2]!=0){error=true;}else{matrizb[b1][b2]=2;};};break;
							}
							poneragua(matrizb,b1, b2, b1f, b2f);
						}
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						error=true;
					}
				}while(error);

				do
				{
					for(int j=0;j<10;j++)
					{
						for(int k=0;k<10;k++)
						{
							matrizc[j][k]=matrizb[j][k];
						}
					}
					try
					{
						error=false;
						c1=(int)Math.round(Math.random()*9);
						c2=(int)Math.round(Math.random()*9);
						int cbarco=3;
					

						if(matrizc[c1][c2]!=0)
						{
							error=true;
						}
						else
						{
							matrizc[c1][c2]=3;
							c1f=c1;
							c2f=c2;

							int cdir=(int)(Math.random()*4)+1;
							switch (cdir)
							{
								case 1: for(int i=1;i<cbarco;i++){c1++;if(matrizc[c1][c2]!=0){error=true;}else{matrizc[c1][c2]=3;};};break;
								case 2: for(int i=1;i<cbarco;i++){c1--;if(matrizc[c1][c2]!=0){error=true;}else{matrizc[c1][c2]=3;};};break;
								case 3: for(int i=1;i<cbarco;i++){c2--;if(matrizc[c1][c2]!=0){error=true;}else{matrizc[c1][c2]=3;};};break;
								case 4: for(int i=1;i<cbarco;i++){c2++;if(matrizc[c1][c2]!=0){error=true;}else{matrizc[c1][c2]=3;};};break;
							}
							poneragua(matrizc,c1, c2, c1f, c2f);
						}
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						error=true;
					}
				}while(error);

				do
				{
					for(int j=0;j<10;j++)
					{
						for(int k=0;k<10;k++)
						{
							matrizd[j][k]=matrizc[j][k];
						}
					}
					try
					{
						error=false;
						d1=(int)Math.round(Math.random()*9);
						d2=(int)Math.round(Math.random()*9);
						int dbarco=4;
					

						if(matrizd[d1][d2]!=0)
						{
							error=true;
						}
						else
						{
							matrizd[d1][d2]=4;
							d1f=d1;
							d2f=d2;

							int ddir=(int)(Math.random()*4)+1;
							switch (ddir)
							{
								case 1: for(int i=1;i<dbarco;i++){d1++;if(matrizd[d1][d2]!=0){error=true;}else{matrizd[d1][d2]=4;};};break;
								case 2: for(int i=1;i<dbarco;i++){d1--;if(matrizd[d1][d2]!=0){error=true;}else{matrizd[d1][d2]=4;};};break;
								case 3: for(int i=1;i<dbarco;i++){d2--;if(matrizd[d1][d2]!=0){error=true;}else{matrizd[d1][d2]=4;};};break;
								case 4: for(int i=1;i<dbarco;i++){d2++;if(matrizd[d1][d2]!=0){error=true;}else{matrizd[d1][d2]=4;};};break;
							}
							poneragua(matrizd,d1,d2, d1f, d2f);
						}
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						error=true;
					}
				}while(error);

				do
				{
					for(int j=0;j<10;j++)
					{
						for(int k=0;k<10;k++)
						{
							matrize[j][k]=matrizd[j][k];
						}
					}
					try
					{
						error=false;
						e1=(int)Math.round(Math.random()*9);
						e2=(int)Math.round(Math.random()*9);
						int ebarco=5;
					
			
						if(matrize[e1][e2]!=0)
						{
							error=true;
						}	
						else
						{
							matrize[e1][e2]=5;
							e1f=e1;
							e2f=e2;

							int edir=(int)(Math.random()*4)+1;
							switch (edir)
							{
								case 1: for(int i=1;i<ebarco;i++){e1++;if(matrize[e1][e2]!=0){error=true;}else{matrize[e1][e2]=5;};};break;
								case 2: for(int i=1;i<ebarco;i++){e1--;if(matrize[e1][e2]!=0){error=true;}else{matrize[e1][e2]=5;};};break;
								case 3: for(int i=1;i<ebarco;i++){e2--;if(matrize[e1][e2]!=0){error=true;}else{matrize[e1][e2]=5;};};break;
								case 4: for(int i=1;i<ebarco;i++){e2++;if(matrize[e1][e2]!=0){error=true;}else{matrize[e1][e2]=5;};};break;
							}
							poneragua(matrize,e1, e2, e1f, e2f);
						}
					}
					catch(ArrayIndexOutOfBoundsException e)
					{
						error=true;
					}
				}while(error);

	}
	
	public static boolean Comprobara(int [][] matriz)
	{
		boolean aspirina=true;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]==1)
				{
					aspirina=false;
				}
			}
		}
		return aspirina;
	}

	public static boolean Comprobarb(int [][] matriz)
	{
		boolean aspirina=true;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]==2)
				{
					aspirina=false;
				}
			}
		}
		return aspirina;
	}

	public static boolean Comprobarc(int [][] matriz)
	{
		boolean aspirina=true;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]==3)
				{
					aspirina=false;
				}
			}
		}
		return aspirina;
	}

	public static boolean Comprobard(int [][] matriz)
	{
		boolean aspirina=true;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]==4)
				{
					aspirina=false;
				}
			}
		}
		return aspirina;
	}

	public static boolean Comprobare(int [][] matriz)
	{
		boolean aspirina=true;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]==5)
				{
					aspirina=false;
				}
			}
		}
		return aspirina;
	}
	
	public static boolean Comprobar(int [][] matriz)
	{
		boolean aspirina=false;
		for(int j=0;j<10;j++)
		{
			for(int k=0;k<10;k++)
			{
				if(matriz[j][k]!=0 && matriz[j][k]!=9 && matriz[j][k]!=8)
				{
					aspirina=true;
				}
			}
		}
		return aspirina;
	}

	public static void comprobarCoor(int x,int y){
		if(matrize[x][y]!=0 && matrize[x][y]!=9)
		{
			matBotones[x][y].setText("Toc");
			matrize[x][y]=8;
		}
		else
		{
			matBotones[x][y].setText("Agu");
			
		}
	}
	
	public static void main(String[]args){
		GUItablero prueba=new GUItablero();
		generar();
	}
}
